Python中yield怎么用? 和return有什么区别 |
您所在的位置:网站首页 › yield 和 return的区别 › Python中yield怎么用? 和return有什么区别 |
self.prev = 0 self.cur = 1 self.n = n def__iter__(self): returnself def__next__(self): ifself.n > 0: value = self.cur self.cur = self.cur + self.prev self.prev = value self.n -= 1 returnvalue else: raiseStopIteration f = Fib( 10) print([i fori inf]) # [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 什么是生成器 普通函数用 return返回一个值,在 Python 中还有一种函数,用关键字 yield来返回值,这种函数叫生成器函数,函数被调用时会返回一个生成器对象而不是yield后面的值。 生成器本质上还是一个迭代器,也是用在迭代操作中,因此它有和迭代器一样的特性,唯一的区别在于实现方式上不一样,后者更加简洁 最简单的生成器函数: >>> deffunc(n): ... yieldn* 2 ... >>> func
>>> g = func( 5) >>> g
>>> func 就是一个生成器函数,调用该函数时返回对象就是生成器 g ,这个生成器对象的行为和迭代器是非常相似的,可以用在 for 循环等场景中。注意 yield 对应的值在函数被调用时不会立刻返回,而是调用next方法时才返回 >>> g = func( 5) >>> next(g) 10 >>> g = func( 5) >>> fori ing: ... print(i) ... 10 一个函数中可以有多个yield语句,有几个yield语句有可以迭代几次。 defgenerate: yield1 yield2 yield3 g = generate print(next(g)) # 1 print(next(g)) # 2 print(next(g)) # 3 print(next(g)) # 报错 StopIteration 那为什么要用生成器呢?显然,它没有那么多冗长代码了,而且性能上一样的高效,为什么不用呢?来看看用生成器实现斐波那契数列有多简单。 deffib(n): prev, curr = 0, 1 whilen > 0: n -= 1 yieldcurr prev, curr = curr, curr + prev print([i fori infib( 10)]) #[1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 生成器表达式 我曾经介绍过列表推导式(list comprehension),生成器表达式与列表推导式长的非常像,但是它俩返回的对象不一样,前者返回生成器对象,后者返回列表对象。 >>> g = (x* 2forx inrange( 10)) >>> type(g)
>>> l = [x* 2forx inrange( 10)] >>> type(l)
前面已经介绍过生成器的优势,就是迭代海量数据时,显然生成器更合适。 ---END--- 推荐↓↓↓返回搜狐,查看更多 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |